﻿/*
 * Created by SharpDevelop.
 * User: Miguel
 * Date: 08/10/2011
 * Time: 02:31 p.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;

namespace Business_Entity
{
	/// <summary>
	/// Description of BEPedidoVenta.
	/// </summary>
	public class BEPedidoVenta
	{
		private int id;
		//private BEEstadoPedidoVenta estado;
		private DateTime fecha;
		private BEEstadoPedidoVenta estado;
		//private List<BELineaPedidoVenta> lineasPedidoVenta;
		private List<BELineaPedidoProducto> lineasProducto;
		private List<BELineaPedidoServicio> lineasServicio;
		private BECliente cliente;
		private BEEmpleado empleado;
		private BETienda tienda;
		
		public int Id{
			get {return this.id;}
			set {this.id = value;}
		}
		
		public bool NoTieneLineas{
			get{return this.LineasPedidoVenta.Count == 0;}
		}
		
		public double MontoTotal{
			get{
				double monto = 0;
				
				foreach(BELineaPedidoProducto l in this.LineasPedidoProducto){
					monto += l.PrecioTotal;
				}
				
				foreach(BELineaPedidoServicio l in this.LineasPedidoServicio){
					monto += l.MontoConDescuento;
				}
				
				return monto;
			}
		}
		
		public double DescuentoTotal{
			get{
				double monto = 0;
				
				foreach(BELineaPedidoProducto l in this.LineasPedidoProducto){
					if (l.Descuento != null){
						monto += l.MontoDescuento;
					}
				}
				
				foreach(BELineaPedidoServicio l in this.LineasPedidoServicio){
					if (l.Descuento != null){
						monto += l.MontoDescuento;
					}
				}
				
				return monto;
			}
		}
		
		public double MontoTotalSinDescuento{
			get{
				double monto = 0;
				
				foreach(BELineaPedidoProducto l in this.LineasPedidoProducto){
					monto += l.PrecioTotalSinDescuento;
				}
				
				foreach(BELineaPedidoServicio l in this.LineasPedidoServicio){
					monto += l.Precio;
				}
				
				return monto;
				
			}
		}
		
				
		public bool tieneProductoDeLinea(BELineaPedidoProducto linea){
			for (int i=0; i<this.lineasProducto.Count; i++){
				if (lineasProducto[i].Producto.Codigo == linea.Producto.Codigo){
					return true;
				}
			}
			return false;
		}
		
		public BETienda Tienda{
			get{return this.tienda;}
			set{this.tienda = value;}
		}
		
		public BEEmpleado Empleado{
			get{return this.empleado;}
			set{this.empleado = value;}
		}
		
		public BECliente Cliente{
			get{return this.cliente;}
			set{this.cliente = value;}
		}
		
		public DateTime Fecha{
			get {return this.fecha;}
			set {this.fecha = value;}
		}
		
		public BEEstadoPedidoVenta Estado{
			get {return this.estado;}
			set {this.estado = value;}
		}

		public List<BELineaPedidoProducto> LineasPedidoProducto{
			get {
				return lineasProducto;
			}
		}
		
		public List<BELineaPedidoVenta> LineasPedidoVenta{
			get{
				List<BELineaPedidoVenta> lst = new List<BELineaPedidoVenta>();
				lst.AddRange(lineasProducto);
				lst.AddRange(lineasServicio);
				
				return lst;
			}
		}
		
		public BELineaPedidoProducto getLineaProducto(int i){
			return lineasProducto[i];
		}
		
		public BELineaPedidoServicio getLineaServicio(int i){
			return lineasServicio[i];
		}
		
		public List<BELineaPedidoServicio> LineasPedidoServicio{
			get {
				return lineasServicio;
			}
		}
		
		public void addLinea(BELineaPedidoVenta linea){
			if (linea is BELineaPedidoServicio){
				lineasServicio.Add((BELineaPedidoServicio)linea);
			}else{
				lineasProducto.Add((BELineaPedidoProducto)linea);
			}
		}
		
		public void removeLineasProducto(List<int>iElims){
			
			List<int> ids = new List<int>();
			for (int i=0; i<iElims.Count; i++){
				ids.Add(this.lineasProducto[iElims[i]].Id);
			}
			
			foreach(int id in ids){
				for( int i=0; i<lineasProducto.Count; i++){
					
					BELineaPedidoProducto l = lineasProducto[i];
					if (l.Id == id){
						this.lineasProducto.RemoveAt(i);
						break;
					}
				}
			}
						
		}
		
		public void removeLineasServicio(List<int>iElims){
			
			List<int> ids = new List<int>();
			for (int i=0; i<iElims.Count; i++){
				ids.Add(this.lineasServicio[iElims[i]].Id);
			}
			
			foreach(int id in ids){
				for( int i=0; i<lineasServicio.Count; i++){
					
					BELineaPedidoServicio l = lineasServicio[i];
					if (l.Id == id){
						this.lineasServicio.RemoveAt(i);
						break;
					}
				}
			}
						
		}
		
		public BEPedidoVenta(int id, DateTime fecha, BEEstadoPedidoVenta estado, BECliente cliente){
			this.id = id;
			this.fecha = fecha;
			this.estado = estado;
			this.cliente = cliente;
			
			this.lineasProducto = new List<BELineaPedidoProducto>();
			this.lineasServicio = new List<BELineaPedidoServicio>();
		}
		
		public BEPedidoVenta(){
			this.lineasProducto = new List<BELineaPedidoProducto>();
			this.lineasServicio = new List<BELineaPedidoServicio>();
		}
	}
}
